package com.qf.game.websocket;

import com.alibaba.fastjson.JSONObject;
import com.qf.game.service.GameService;
import com.qf.game.utils.RoomManagerUtils;
import com.qf.game.utils.SessionUtils;
import com.qf.game.websocket.entity.Room;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;

/**
 * WebSocket的服务端 - 这个类专门用来处理WebScoket协议的相关请求
 *
 * description:
 * author: Ken
 * 公众号：Java架构栈
 */
@ServerEndpoint("/gogame")
public class MyWebSocketServer {

    private GameService gameService = new GameService();

    /**
     * 当有一个客户端和服务器建立WebSocket连接时 触发该方法
     * @param session - 该参数就代表服务器和这个客户端的连接
     */
    @OnOpen
    public void open(Session session){
        System.out.println("有一个客户端和服务器建立了连接！！");
    }

    /**
     * 当有一个客户端和服务器断开连接时，触发该方法
     */
    @OnClose
    public void close(Session session){
        System.out.println("有一个客户端和服务器断开了连接！！");
        gameService.closeSession(session);
    }

    /**
     * 当连接发生错误时，触发该方法
     */
    @OnError
    public void error(Session session, Throwable t){
        System.out.println("有一个客户端连接发生异常！");
        t.printStackTrace();
    }

    /**
     * 当客户端给服务器发送消息时 触发该方法
     *
     * message -> {"type":xxx,xxxx,xxx}
     * {"type":100,"rid":56,"pid":xxx,"header":xxx,"level":} - 加入房间
     *
     */
    @OnMessage
    public void message(String message, Session session){
        System.out.println("服务器接收到客户端发送的消息：" + message);
        //将json字符串 -> JSONObject对象
        //{"type":100,"rid":3,"pid":12,"header":"fa550497-0180-4d97-8686-fa7f9b7b9db6","nickname":"小明","level":0} ->  JSONObject对象
        JSONObject jsonObject = JSONObject.parseObject(message);
        int type = jsonObject.getIntValue("type");

        //根据消息的类型，服务器进行不同的处理
        switch (type) {
            case 100:
                //加入房间
                gameService.addRoom(jsonObject, session);
                break;
            case 101:
                //落子的消息
                gameService.go(jsonObject, session);
                break;
            case 102:
                //音频消息
                int rid = jsonObject.getIntValue("rid");
                String audioName = jsonObject.getString("audioName");
                Room room = RoomManagerUtils.getRoomById(rid);

                Map<String, Object> msg = new HashMap<>();
                msg.put("type", 212);
                msg.put("audioName", audioName);
                if (room.getOtherPlayer(session) != null) {
                    SessionUtils.sendMsg(room.getOtherPlayer(session).getSession(), msg);
                }
                break;
        }
    }
}
